Playwright 爬虫教程 (2024 最新版)

各位做动态页面数据抓取的同学,是不是早就烦透了 Selenium 的驱动版本匹配噩梦、Puppeteer 的功能局限在 Chromium 里?今天给大家安利的 微软 2020 开源的 Playwright,经过 4 年迭代已经是自动化工具的顶流,拿来爬动态渲染页面简直是爽歪歪!


1. 为什么选 Playwright 做爬虫?

和同行相比,它的优势太戳爬虫er的痛点了:

  • 全引擎覆盖:Chromium、Firefox、WebKit(Safari内核)全拿下,不用纠结换浏览器测试反爬
  • 全平台通用:Windows、macOS、Linux 一键安装驱动,告别 chromedriver.exe 下载失败的破事
  • 自动等待太省心:不用自己写一堆 time.sleep() 或者复杂的等待条件,它会等元素加载、可交互后再执行操作
  • 反爬友好:自带设备指纹、地理模拟、网络拦截这些实用功能
  • 性能拉满:比 Selenium 快,比 Puppeteer 功能全

2. 快速安装配置

环境要求

Python 3.8+,三大主流系统都没问题。

国内/通用双安装方案

通用方案直接走官方,但国内用户大概率会卡在库安装和浏览器下载环节,所以优先看国内镜像加速版👇:

# 国内镜像:安装 Playwright Python 库
pip install playwright -i https://pypi.tuna.tsinghua.edu.cn/simple
# 国内镜像:下载三大浏览器引擎(约 200-300MB)
PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright playwright install

通用版适合网络环境好的同学:

pip install playwright
playwright install

3. 基础入门:同步 VS 异步

Playwright 提供了两种运行模式,新手推荐同步模式(代码直观好写),需要高并发的场景再换异步模式

同步模式:5 行代码打开百度

我们先写个最简单的测试脚本——打开百度首页、打印标题、截图、关浏览器:

from playwright.sync_api import sync_playwright

# 同步上下文管理器自动管理资源,不用手动关!
with sync_playwright() as p:
    # 启动浏览器,headless=False 可以看到浏览器窗口,True 是后台运行
    browser = p.chromium.launch(headless=False)
    # 创建新页面
    page = browser.new_page()
    # 导航到目标页
    page.goto("https://www.baidu.com")
    # 打印页面标题
    print(f"页面标题: {page.title()}")
    # 截图保存
    page.screenshot(path="baidu_home.png")

异步模式:适合批量操作

如果要同时爬几十个页面,异步模式效率更高:

import asyncio
from playwright.async_api import async_playwright

async def open_baidu():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()
        await page.goto("https://www.baidu.com")
        print(await page.title())
        await browser.close()

# Python 3.7+ 可以直接用 asyncio.run()
asyncio.run(open_baidu())

4. 懒人神器:代码生成工具

写爬虫最麻烦的就是元素定位?别慌!Playwright 自带 codegen 代码录制器——你在浏览器里做什么操作,它自动生成 Python 代码!

比如要生成登录B站的代码,直接运行:

# --target python 生成 Python 代码,-o 保存到脚本,-b 指定浏览器(可选)
playwright codegen --target python -o bilibili_login.py -b firefox https://www.bilibili.com

运行后会同时打开 Firefox 浏览器和代码编辑器,你输入账号、点击登录这些动作,编辑器里会实时生成完整的 Python 脚本,稍微改改就能用!


5. 核心功能:爬动态渲染的必备操作

元素定位

Playwright 支持多种定位方式,新手优先用文本选择CSS选择器,更灵活的用组合选择器

# 文本选择(最直观,适合反爬弱的网站)
page.click("text=登录")

# CSS选择器(和 BeautifulSoup 一样,不用重新学)
page.fill("#login-username", "your_username")
page.fill(".login-password", "your_password")

# 组合选择器(精准定位有特定文本的元素)
page.click("article:has-text('Playwright爬虫教程')")

等待机制(自动等待不够用时)

虽然 Playwright 有自动等待,但遇到复杂的无限滚动、异步接口,可能需要手动补充等待:

# 1. 等待某个元素出现(最常用)
page.wait_for_selector(".dynamic-data-item", timeout=30000)  # 超时时间默认30秒

# 2. 等待网络空闲(所有请求都完成)
page.wait_for_load_state("networkidle")

# 3. 强制等待(不到万不得已别用)
page.wait_for_timeout(2000)

网络拦截(禁用图片/广告,提升速度)

爬动态页面时,图片、广告这些资源占带宽又没用,我们可以用 route 拦截

import json

# 拦截所有图片请求
page.route("**/*.{png,jpg,jpeg,gif,webp}", lambda route: route.abort())

# 拦截广告接口
page.route("**/ad/**", lambda route: route.abort())

# 甚至可以修改响应内容(适合测试反爬逻辑)
page.route("**/api/user-info", lambda route: route.fulfill(
    status=200,
    content_type="application/json",
    body=json.dumps({"name": "test_user", "level": 10})
))

6. 实用反爬技巧(基础版)

模拟移动端设备

很多网站对移动端反爬更松,Playwright 内置了几乎所有主流设备的配置

with sync_playwright() as p:
    # 获取 iPhone 15 Pro 的设备配置
    iphone_15 = p.devices["iPhone 15 Pro"]
    # 用 WebKit(Safari)启动浏览器更真实
    browser = p.webkit.launch(headless=False)
    # 创建带设备配置的上下文
    context = browser.new_context(**iphone_15)
    page = context.new_page()
    page.goto("https://www.taobao.com")
    page.screenshot(path="taobao_mobile.png")

设置地理位置

有些网站需要特定地区的IP才能访问,除了代理IP,还可以模拟地理位置

context = browser.new_context(
    **iphone_15,
    # 北京天安门的经纬度
    geolocation={"latitude": 39.913904, "longitude": 116.39014},
    # 授予地理位置权限
    permissions=["geolocation"]
)

7. 常见问题解决

Q1: 元素点击失败?

  • 先检查元素是不是被弹窗、广告挡住了
  • 试试强制点击:page.click(selector, force=True)
  • 先把元素滚动到可见区域:page.scroll_into_view_if_needed(selector)

Q2: 页面加载超时?

  • 增加超时时间:page.goto(url, timeout=60000)
  • 拦截不必要的资源(图片、广告)
  • 检查目标网站是不是需要挂代理

Q3: 如何绕过验证码?

  • 复杂的验证码(滑块、点选、拼图)建议用第三方识别服务(比如打码兔)
  • 配置浏览器的持久化上下文,保存登录状态和 cookies,避免每次都登录

8. 资源推荐

遇到问题别慌,先看官方文档(中文超全!):


今天的教程就到这里啦!Playwright 不仅适合做动态爬虫,还能做自动化测试,感兴趣的同学可以继续深入探索~